//
//  MZTAPI.swift
//  RxMoya
//
//  Created by XuHao on 2018/4/26.
//  Copyright © 2018年 XuHao. All rights reserved.
//
import Moya
import RxSwift

/// 首先声明一个 enum 来对当前API 文件要是先的功能进行明确分类
enum MZTAPI {
    /// 我这里功能就很专一，就获取一个妹子图片你懂的！！
    case GetMz
}

// MARK: - Provider setup
// 序列化
private func JSONResponseDataFormatter(_ data: Data) -> Data {
    do {
        let dataAsJSON = try JSONSerialization.jsonObject(with: data)
        let prettyData =  try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
        return prettyData
    } catch {
        return data // fallback to original data if it can't be serialized.
    }
}

/// 先来个最简单的
let zmtProvider = MoyaProvider<MZTAPI>.init(plugins: [NetworkLoggerPlugin.init(verbose: false, responseDataFormatter: JSONResponseDataFormatter)])

/// 下面开始 实现 TargetType 协议
extension MZTAPI: TargetType {
    
    var baseURL: URL {
        return  URL.init(string: "https://api.isoyu.com/index.php")!
    }
    
    var path: String {
        
        // 一般一个API文件中有多个请求，那么就会有多个请求路径
        // 这里就这样写
        switch self {
        case .GetMz:
            return "/api/Picture/hua_ban"
        }
        
    }
    
    var method: Moya.Method {
        
        // 这里 同 path 一样的道理
        switch self {
        case .GetMz:
            return .get
        }
    }
    
    var sampleData: Data {
        
        // 这里是单元测试数据，如果不需要写单元测试这里就可以管,但是必须要实现
        return "".data(using: String.Encoding.utf8)!
    }
    
    var task: Task {
        
        // 在swfit4.0 中Moya 需要在这里为每个请求添加接口参数
        switch self {
        case .GetMz:
            return .requestPlain // 这里代表不需要请求参数
        }
    }
    
    var headers: [String : String]? {
        
        return nil
    }
}

// MARK: - Response Handlers

extension Moya.Response {
    func mapNSArray() throws -> NSArray {
        let any = try self.mapJSON()
        guard let array = any as? NSArray else {
            throw MoyaError.jsonMapping(self)
        }
        return array
    }
}

